﻿package com.snzflash.components.core 
{
	import com.snzflash.events.ComponentEvent;
	import flash.events.Event;
	import org.casalib.display.CasaSprite;
	
	/**
	 * Базовый класс для построения компонентов
	 * 
	 * Наследуется от CasaSprite  - для удобной подчистки за собой объектов
	 * и добавляются механизм обработки Event.Render для отрисовки компонента
	 * @author firsoff maxim, tel: +79222345364, skype: maxim.firsoff
	 */
	public class UIComponent extends CasaSprite
	{
		// геометрия
		protected var __width:Number;
		protected var __height:Number;
		protected var _data:Object;
		// факт смены свойств
		protected var _changed:Boolean;
		
		//protected var _stageDetector:StageDetector;
		protected var _systemManager:SystemManager;
		// == STATIC==
		// дефолтные значения для высоты и ширины
		public static const DEFAULT_WIDTH:Number = 100;
		public static const DEFAULT_HEIGHT:Number = 100;
		
		
		public function UIComponent() 
		{
			super();
			init();
		}
		
		// private METHODS
		
		/**
		 * Инициализация компонента
		 */
		protected function init():void
		{
			initSystemManager();
			initProperties();
			create();
			addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			dispatchEvent(new ComponentEvent(ComponentEvent.CREATION_COMPLETE));;
		};
		
		/**
		 * Инициализация системного менеджера
		 */
		protected function initSystemManager():void
		{
			_systemManager = SystemManager.getInstance();
			////trace(_systemManager);
			_systemManager.addComponent(this);
		};
		
		/**
		 * Удаление компонента из системного менеджера
		 */
		protected function removeSystemManager():void
		{
			_systemManager.removeComponent(this);
			_systemManager = null;
		};
		
		/**
		 * Иницилизация свойств
		 */
		protected function initProperties():void
		{
			__width = DEFAULT_WIDTH;
			__height = DEFAULT_HEIGHT
		};
		
		/**
		 * Абстрактный метод для создания контента
		 */
		protected function create():void
		{
			
		};
		
		/**
		 * Обновление внутренного контента компонента
		 */
		protected function updateDisplayList():void
		{
			
		};
		
		/**
		 * Заставляем сделать обновление
		 */
		public function invalidate():void
		{
			_changed = true;
			if( _systemManager) _systemManager.invalidate(this);
		};
		
		/**
		 * обновление компонента немедленно
		 */
		public function validateNow():void 
		{
			////trace('validateNow');
			if ( _changed ) updateDisplayList();
			_changed = false;
		}
		
		/**
		 * уничтожение компонента
		 */
		override public function destroy():void 
		{
			super.destroy();
			removeSystemManager();
			dispatchEvent(new ComponentEvent(ComponentEvent.DESTROY));
		};
		
		
		public function get data():Object { return _data; };
		
		public function set data(value:Object):void 
		{
			_data = value;
			invalidate();
		};
		
		public function get changed():Boolean { return _changed; };
		
		override public function get width():Number { return __width; };
		
		override public function set width(value:Number):void 
		{
			if (value == __width) return;
			__width = value;
			
			invalidate();
		};
		
		override public function get height():Number { return __height; };
		
		override public function set height(value:Number):void 
		{
			if (value == __height) return;
			__height = value;
			invalidate();
		};
		
		public function get rawHeight():Number { return super.height; };
		
		public function set rawHeight(value:Number):void 
		{
			super.height = value;
			invalidate();
		};
		
		public function get rawWidth():Number { return super.width; };
		
		public function set rawWidth(value:Number):void 
		{
			super.width = value;
			invalidate();
		};
		
		/**
		 * При добавлении подписываемся на рендер
		 * @param	event
		 */
		protected function onAddedToStage(event:Event):void 
		{
			_systemManager.stage = stage;
			invalidate();
		};
	}

}